//   @Name    : merchant_driver
//   @author  : simon
//   @date    : 2020/7/11 2:36 PM
//   @version : 1.0
//   @desc    : 加载loading,有bug：在快速请求失败的情况，showLoading还没弹窗，hide就调用。
//   2023.11.04 重构
//   2024.06.25 优化增加dialogs数组记录，移除。
//   2024.10.25 适配MediaQuery.withNoTextScaling字体大小不改变。
//   2014-11-25:useRootNavigator: false,显示dialog应该是最近的Navigator上，不能是rootNavigator。
//   2014-12-30:不能使用Dialog自己的buildContext来pop。showDialog的builder内部有build()函数,需要点时间，等它走完;如果不用等它走完就直接调用pop，那么这个show就会被关掉。
//   注意：不能等着用这个build()函数的context，不然hide函数快速调的时候会有bug。
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';

class CAILoadingDialog {
  static CAILoadingDialog loadingDialog = CAILoadingDialog();
  BuildContext? dialogBuildContext;

  //避免使用根 Navigator，直接绑定到当前页面，自动管理对话框生命周期。
  static Future<void> showLoading<T>(BuildContext context, {String? msg}) {
    if (context.mounted &&
        Navigator.of(context).mounted &&
        CAILoadingDialog.loadingDialog.dialogBuildContext != null) {
      return Future.value();
    }
    CAILoadingDialog.loadingDialog.dialogBuildContext = context;
    //优点：能自动添加整体遮罩
    return showDialog<T>(
        context: context,
        barrierDismissible: false,
        useRootNavigator: false,
        routeSettings: const RouteSettings(name: 'CAILoadingDialog'),
        // showDialog的builder内部有build()函数,需要点时间，等它走完;如果不用等它走完就直接调用pop，那么这个show就会被关掉。
        // 注意：不能等着用这个build()函数的context，不然hide函数快速调的时候会有bug。
        builder: (ctx) {
          ///设置文字大小不随用户设置动态字体大小而改变
          return MediaQuery.withNoTextScaling(
              child: LoadingDialog(
            msg: msg,
          ));
        });
  }

  //1.如果之前没有用loading，但是调用Navigator.pop(context)，则会造成关闭page页的bug。
  //2.是否使用rootNavigator=true，要和showDialog对应是否使用rootNavigator=true；
  //3.遇到有2个Navigator（MaterialApp）的时候,Navigator.of(context,rootNavigator: true)指根Navigator，
  // Navigator.of(context,rootNavigator: false)指最近的navigator，就是2个不同的结果对象；
  // 如果只有一个Navigator（MaterialApp）的时候,rootNavigator属性设置true/false，都是同一个对象结果。
  //4.当有多个Navigator（MaterialApp）的时候，需要使用最近的navigator来做导航交互。
  //5.showDialog表示增加一个路由页面，对应Navigator.of().pop(),会把指定Navigator的Dialog路由页面pop掉;
  // NavigatorState navigatorState = Navigator.of(context,rootNavigator: true);
  // navigatorState.pop();
  // navigatorState.removeRoute(route);
  // viewControllersObserver.removeRouteWithName(name: 'CAILoadingDialog',context: context);
  // Navigator.pop(CAILoadingDialog.loadingDialog.dialogBuildContext!);
  static void hide() {
    BuildContext? context = CAILoadingDialog.loadingDialog.dialogBuildContext;
    if (context != null) {
      if (context.mounted && Navigator.of(context).mounted) {
        NavigatorState navigatorState =
            Navigator.of(context, rootNavigator: false);
        navigatorState.pop();
      }
      CAILoadingDialog.loadingDialog.dialogBuildContext = null;
    }
  }
}

class LoadingDialog extends StatelessWidget {
  final String? msg;
  const LoadingDialog({super.key, this.msg});

  @override
  Widget build(BuildContext context) {
    Widget dialogChild = SizedBox(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          const SpinKitCircle(color: Colors.white),
          const SizedBox(height: 10.0),
          Text(msg ?? "加载中···",
              style: const TextStyle(
                color: Colors.white,
                fontSize: 12,
              )),
        ],
      ),
    );
    //Dialog底层，最小宽度280
    Dialog dialog = Dialog(
        backgroundColor: Colors.transparent, elevation: 0, child: dialogChild);
    return dialog;
  }
}
